package com.example.addrparserdemo.util;

import com.zaxxer.hikari.HikariDataSource;

import javax.sql.DataSource;

/**
 * jdbc工具类
 *
 * @author leiguoqing
 */
public class JdbcUtils {
    /**
     * 创建出 HikariDataSource 数据源
     */
    private static final HikariDataSource DATA_SOURCE = new HikariDataSource();

    // HikariDataSource 数据源的自定义配置 (静态代码块只会执行一次)
    static {
        // 数据库连接信息配置,必须的
        DATA_SOURCE.setDriverClassName("com.mysql.cj.jdbc.Driver");
        DATA_SOURCE.setJdbcUrl("jdbc:mysql://localhost:3306/addrparser-demo");
        DATA_SOURCE.setUsername("root");
        DATA_SOURCE.setPassword("123456");

        // 对象连接池中的连接数量配置,可选的
        DATA_SOURCE.setAutoCommit(true);

        // 连接测试SQL
        DATA_SOURCE.setConnectionTestQuery("SELECT 1");

        // 所有新连接上执行的SQL字符串， set names utf8 是用于设置编码，可以再在建数据库的时候设置，也可以在创建表的时候设置，或只是对部分字段进行设置，
        // 而且在设置编码的时候，这些地方最好是一致的，这样能最大程度上避免数据记录出现乱码
        DATA_SOURCE.setConnectionInitSql("set names utf8mb4");

        // 等待连接池分配连接的最大时长（毫秒），超过这个时长还没可用的连接则发生SQLException， 缺省:30秒
        DATA_SOURCE.setConnectionTimeout(30000);

        // 一个连接idle状态的最大时长（毫秒），超时则被释放（retired），缺省:10分钟
        DATA_SOURCE.setIdleTimeout(30000);

        // 一个连接的生命时长（毫秒），超时而且没被使用则被释放（retired），缺省:30分钟，建议设置比数据库超时时长少30秒，参考MySQL wait_timeout参数（show variables like '%timeout%'
        DATA_SOURCE.setMaxLifetime(1800000);

        // 连接池中允许的最大连接数。缺省值：10；推荐的公式：((core_count * 2) + effective_spindle_count)
        DATA_SOURCE.setMaximumPoolSize(15);

        // 该属性控制 HikariCP 尝试在池中维护的最小空闲连接数，包括空闲和使用中的连接。 如果空闲连接低于此值，HikariCP 将尽最大努力快速有效地恢复它们。
        DATA_SOURCE.setMinimumIdle(5);

        DATA_SOURCE.setPoolName("UserHikariCP");
    }

    /**
     * 定义静态方法,返回DataSource实现类的对象
     *
     * @return the data source
     */
    public static DataSource getDataSource() {
        return DATA_SOURCE;
    }
}
